import { message } from 'ant-design-vue'
import * as regular from '@/utils/regular'
import * as inter from '@/types/modules/security'

/**
 * @method 【安全中心】用户账号新增/编辑
 * @desc import { userAccountRules } from '@/utlis/verification/rules/user'
 */
export const userAccountRules = (state: { account: string; name: string }, SecurityState: inter.policy) => {
  return new Promise<void>(async (resolve, reject) => {
    if (!state.account) {
      message.error('请输入用户账号')
      return reject('请输入用户账号')
    }
    if (!state.name) {
      message.error('请输入用户名称')
      return reject('请输入用户名称')
    }
    if (!regular.cnNumAz.test(state.name)) {
      message.error('用户名称只允许中文/字母/数字')
      return reject('用户名称只允许中文/字母/数字')
    }
    if (state.name.length < 2 || state.name.length > 50) {
      message.error('用户名称字符长度在2-50位字符')
      return reject('用户名称字符长度在2-50位字符')
    }
    try {
      await securityHandle('账户', state.account, SecurityState)
      resolve()
    } catch {
      reject()
    }
  })
}

/**
 * @method 【安全中心】用户账号新增/编辑
 * @desc import { userPassword } from '@/utlis/verification/rules/user'
 */
export const userPasswordRules = (state: { oldPassword: string; newPassword: string; confirmPassword: string }, SecurityState: inter.policy) => {
  return new Promise<void>(async (resolve, reject) => {
    console.log(state)
    // 修改密码校验
    if (state.newPassword === state.oldPassword) {
      message.error('新密码不能与旧密码相同')
      return reject('新密码不能与旧密码相同')
    }
    if (state.newPassword !== state.confirmPassword) {
      message.error('确认密码和新密码不一致')
      return reject('确认密码和新密码不一致')
    }
    try {
      await securityHandle('密码', state.confirmPassword, SecurityState)
      resolve()
    } catch {
      reject()
    }
  })
}

export const securityHandle = (name: '账户' | '密码' | '初始密码', data: any, security: inter.policy) => {
  return new Promise<void>((resolve, reject) => {
    const { value, number, letterUppercase, letterLowercase, symbol } = security
    if (value) {
      // 验证账号/密码长度
      const dataLength = security.value.split('-')
      const dataStart = dataLength[0]
      const dataEnd = dataLength[1]
      if (data.length < dataStart || data.length > dataEnd) {
        message.error(`用户${name}长度必须在${dataStart}-${dataEnd}之间`)
        return reject(`用户${name}长度必须在${dataStart}-${dataEnd}之间`)
      }
    }
    // 设置的字符类型
    const str = `${number},${letterUppercase},${letterLowercase},${symbol}`
    // 纯数字
    const isNum = /\d+/.test(data)
    // 纯大写
    const isAZ = /[A-Z]+/.test(data)
    // 纯小写
    const isaz = /[a-z]+/.test(data)
    // 纯中文
    const iszh = /[\u4e00-\u9fa5]+/.test(data)
    // 纯特殊字符
    const isspecial = /[^a-zA-Z0-9\u4e00-\u9fa5]+/.test(data)
    // 所有字符类型组合的枚举
    const rulesEnum = {
      // 纯特殊字符
      '0,0,0,1': {
        regular: isspecial && !isNum && !isAZ && !isaz && !iszh,
        message: '纯特殊字符',
      },
      // 纯小写字母
      '0,0,1,0': {
        regular: isaz && !isNum && !isAZ && !iszh && !isspecial,
        message: '纯小写字母',
      },
      // 小写字母+特殊字符
      '0,0,1,1': {
        regular: isaz && isspecial && !isNum && !isAZ && !iszh,
        message: '小写字母+特殊字符',
      },
      // 纯大写字母
      '0,1,0,0': {
        regular: !isaz && !isspecial && !isNum && isAZ && !iszh,
        message: '纯大写字母',
      },
      // 大写字母+特殊字符
      '0,1,0,1': {
        regular: !isaz && isspecial && !isNum && isAZ && !iszh,
        message: '大写字母+特殊字符',
      },
      // 大写字母+小写字母
      '0,1,1,0': {
        regular: isaz && !isspecial && !isNum && isAZ && !iszh,
        message: '大写字母+小写字母',
      },
      // 大写字母+小写字母+特殊字符
      '0,1,1,1': {
        regular: isaz && isspecial && !isNum && isAZ && !iszh,
        message: '大写字母+小写字母+特殊字符',
      },
      // 纯数字
      '1,0,0,0': {
        regular: !isaz && !isspecial && isNum && !isAZ && !iszh,
        message: '纯数字',
      },
      // 数字+特殊字符
      '1,0,0,1': {
        regular: !isaz && isspecial && isNum && !isAZ && !iszh,
        message: '数字+特殊字符',
      },
      // 数字+小写字母
      '1,0,1,0': {
        regular: isaz && !isspecial && isNum && !isAZ && !iszh,
        message: '数字+小写字母',
      },
      // 数字+小写字母+特殊字符
      '1,0,1,1': {
        regular: isaz && isspecial && isNum && !isAZ && !iszh,
        message: '数字+小写字母+特殊字符',
      },
      // 数字+大写字母
      '1,1,0,0': {
        regular: !isaz && !isspecial && isNum && isAZ && !iszh,
        message: '数字+大写字母',
      },
      // 数字+大写字母+特殊字符
      '1,1,0,1': {
        regular: !isaz && isspecial && isNum && isAZ && !iszh,
        message: '数字+大写字母+特殊字符',
      },
      // 数字+大写字母+小写字母
      '1,1,1,0': {
        regular: isaz && !isspecial && isNum && isAZ && !iszh,
        message: '数字+大写字母+小写字母',
      },
      // 数字+大写字母+小写字母+特殊字符
      '1,1,1,1': {
        regular: isaz && isspecial && isNum && isAZ && !iszh,
        message: '数字+大写字母+小写字母+特殊字符',
      },
    }
    if (!rulesEnum[str].regular) {
      message.error(`用户${name}必须是${rulesEnum[str].message}`)
      reject(`用户${name}必须是${rulesEnum[str].message}`)
    } else {
      resolve()
    }
  })
}

// const validateNewPwd = async (rule: any, value: string) => {
//   if (!value.length) {
//     return Promise.reject('请输入新密码')
//   } else if (!regular.numAndEngCheck(value)) {
//     return Promise.reject('密码只能是数字跟英文结合的字符串')
//   } else {
//     return Promise.resolve()
//   }
// }

// const validatesurePwd = async (rule: any, value: string) => {
//   if (!value.length) {
//     return Promise.reject('请输入确认密码')
//   } else if (value !== formState.confirmPassword) {
//     return Promise.reject('确认密码与新密码不一致')
//   } else {
//     return Promise.resolve()
//   }
// }
